package com.bt.lms.ui.page.sys.study.action;

import com.bt.lms.constants.BOConstant;
import com.bt.lms.constants.PageConstant;
import com.bt.lms.constants.SysBizTypeConstant;
import com.bt.lms.entity.page.Page;
import com.bt.lms.network.msg.ReqMsg;
import com.bt.lms.network.msg.RespMsg;
import com.bt.lms.ui.page.sys.ServerInfo;
import com.bt.lms.ui.page.sys.utils.ArrayUtils;
import com.bt.lms.ui.page.sys.utils.Encode;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import com.bt.lms.ui.page.sys.vo.StudyCenTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

/**
 * 删除学习中心按钮事件
 *
 * @author 徐大永
 */
public class SLDeleteBtnAction implements EventHandler<ActionEvent> {

    /**
     * 要删除的学习中心
     */
    private final StudyCenTableViewVo studyCenTableViewVo;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 构建事件
     *
     * @param studyCenTableViewVo 要删除的学习中心
     * @param pageSkipInfo        界面跳转信息
     */
    public SLDeleteBtnAction(StudyCenTableViewVo studyCenTableViewVo, PageSkipInfo pageSkipInfo) {
        this.studyCenTableViewVo = studyCenTableViewVo;
        this.pageSkipInfo = pageSkipInfo;
    }

    @Override
    public void handle(ActionEvent event) {

        //删除弹窗提示
        Alert alert = new Alert(Alert.AlertType.NONE);
        alert.setHeaderText(null);//自带提示
        alert.setTitle("删除");
        PageStudyCenDelete pageStudyCenDelete = new PageStudyCenDelete(alert, studyCenTableViewVo, pageSkipInfo);
        alert.setGraphic(pageStudyCenDelete);//内容显示
        alert.getDialogPane().setMaxWidth(500);//宽度
        alert.getDialogPane().setMaxHeight(500);////高度
        alert.showAndWait();

    }

    /**
     * 删除学习中心界面
     */
    private static class PageStudyCenDelete extends VBox {

        /**
         * 构建界面
         *
         * @param alert               弹框
         * @param studyCenTableViewVo 学习中心信息
         * @param pageSkipInfo        界面跳转信息
         */
        public PageStudyCenDelete(Alert alert, StudyCenTableViewVo studyCenTableViewVo, PageSkipInfo pageSkipInfo) {

            //布局
            this.setSpacing(10);
            this.setAlignment(Pos.CENTER);
            this.setPadding(new Insets(50));

            //组件
            Label label = new Label("是否删除学习中心：" + studyCenTableViewVo.getName());
            label.setPrefWidth(PageConstant.NODE_BIG_WIGHT);
            label.setAlignment(Pos.CENTER_RIGHT);
            this.getChildren().addAll(label);

            HBox hBox = new HBox();
            hBox.setAlignment(Pos.CENTER);
            hBox.setSpacing(20);
            this.getChildren().add(hBox);

            Button confirm = new Button("确认");
            hBox.getChildren().add(confirm);
            //事件
            DeleteStudyCenConfirmBtnAction deleteStudyCenConfirmBtnAction = new DeleteStudyCenConfirmBtnAction(alert, studyCenTableViewVo, pageSkipInfo);
            confirm.setOnAction(deleteStudyCenConfirmBtnAction);

            Button cancel = new Button("取消");
            hBox.getChildren().add(cancel);
            cancel.setOnAction(event -> NetWorkUtils.reqStudyCenPagingPage(pageSkipInfo,new Page<>()));
        }
    }

    /**
     * 删除学习中心界面的确认按钮事件
     */
    private static class DeleteStudyCenConfirmBtnAction implements EventHandler<ActionEvent> {

        /**
         * 界面跳转信息
         */
        private final PageSkipInfo pageSkipInfo;

        /**
         * 要删除的学习中心
         */
        private final StudyCenTableViewVo studyCenTableViewVo;

        /**
         * 弹窗
         */
        private final Alert alert;

        /**
         * 构建事件
         *
         * @param alert       弹窗
         * @param studyCenTableViewVo 要删除的学习中心
         * @param pageSkipInfo 界面跳转信息
         */
        public DeleteStudyCenConfirmBtnAction(Alert alert, StudyCenTableViewVo studyCenTableViewVo, PageSkipInfo pageSkipInfo) {
            this.alert = alert;
            this.studyCenTableViewVo = studyCenTableViewVo;
            this.pageSkipInfo = pageSkipInfo;
        }

        @Override
        public void handle(ActionEvent event) {
            //去除弹窗
            ButtonType buttonType = new ButtonType("");
            alert.getDialogPane().getButtonTypes().add(buttonType);
            alert.close();

            //组装网络消息包
            ReqMsg reqMsg = Encode.encodeToMsg(studyCenTableViewVo, SysBizTypeConstant.STUDY_CEN_DELETE);
            byte[] bytes = reqMsg.toBytes();
            //1.组网
            Socket socket = pacNet();
            OutputStream out;
            try {
                out = socket.getOutputStream();
            } catch (IOException e) {
                throw new RuntimeException(e);//拿输出流
            }
            //2.发送
            boolean res = sendReq(out, bytes);
            //判断是否发送成功
            if (res) {
                try {
                    //成功发送，等待响应
                    InputStream in = socket.getInputStream();
                    //3 接收响应
                    //3.1 接受响应
                    List<byte[]> bufS = NetWorkUtils.receive(in);
                    //3.2 处理结果
                    byte[] respBytes = ArrayUtils.joinBytes(bufS);
                    //3.3 转消息
                    RespMsg respMsg = RespMsg.toRespMsg(respBytes);
                    //3.4 比较状态
                    short status = respMsg.getStatus();
                    if (status == RespMsg.NETWORK_STATUS_NORMAL) {
                        //关闭资源
                        in.close();
                        socket.close();
                        //成功删除，程序结束
                        finish();
                    } else {
                        String failStr = "服务器未响应，请联系客服。";
                        hintFrame(failStr);//提示框
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            } else {
                String failStr = "未能成功删除，请稍候重试。";
                hintFrame(failStr);//提示框
            }
        }

        /**
         * 程序结束
         */
        private void finish() {

            //提示弹窗
            Alert alert = new Alert(Alert.AlertType.INFORMATION);

            //保存提示
            alert.setTitle("成功");
            alert.setHeaderText(null);
            alert.setContentText("删除成功");
            alert.showAndWait();

            NetWorkUtils.reqStudyCenPagingPage(pageSkipInfo,new Page<>());

        }

        /**
         * 发送请求
         *
         * @param out   输出流
         * @param bytes 要发送的数据
         * @return 发送结果
         */
        private boolean sendReq(OutputStream out, byte[] bytes) {


            try {
                out.write(bytes);
                out.flush();

            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            return true;

        }

        /**
         * 组网
         *
         * @return 网
         */
        private Socket pacNet() {

            String ip = ServerInfo.IP;
            int port = ServerInfo.PORT;

            Socket socket;
            try {
                socket = new Socket(ip, port);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            return socket;
        }

        /**
         * 程序终止
         * 弹窗提示
         *
         * @param result 终止提示
         */
        private void hintFrame(String result) {
            //提示弹窗
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            //错误提示
            alert.setTitle("失败");
            alert.setHeaderText(null);
            alert.setContentText(result);
            alert.showAndWait();
        }
    }
}
